Option Explicit

'################################################################
' Descriptor
' 子查询的表信息
'################################################################

Implements ISqlTranslateTableInfo

'################################################################
' Field
'################################################################
' 别名token
Private aliasNameToken As SqlToken

' 当前子查询的作用域
' 这个作用域只限于此，没有父级作用域
Private selectTableEnv As ISqlTranslateEnv

' 当前表信息的名称
Private tableName As String
'################################################################
' Init
'################################################################
Public Sub Init(ByRef env As ISqlTranslateEnv)
    Set selectTableEnv = env

    Set aliasNameToken = Nothing
End Sub

'################################################################
' Function
'################################################################
' 获取子查询的作用域
Public Function getSelectTableEnv() As ISqlTranslateEnv
    Set getSelectTableEnv = selectTableEnv
End Function

' 设置当前表的表名
Public Sub setTableName(ByRef n As String)
    tableName = n
End Sub

' 设置子查询的作用域
Public Sub setSelectTableEnv(ByRef env As ISqlTranslateEnv)
    selectTableEnv.setParentEnv env
End Sub

' 尝试将子查询作用域中的真实表替换成 with 表作用域
Public Sub transFormRealTableToWithTable()
    selectTableEnv.transFormRealTableToWithTable
End Sub

'################################################################
' Implements ISqlTranslateTableInfo Function
'################################################################
' 设置别名 token
Public Sub ISQLTranslateTableInfo_setAliasNameToken(ByRef t As SqlToken)
    Set aliasNameToken = t
End Sub

' 获取别名 token
Public Function ISQLTranslateTableInfo_getAliasNameToken() As SqlToken
    Set ISQLTranslateTableInfo_getAliasNameToken = aliasNameToken
End Function

' 获取别名
Public Function ISQLTranslateTableInfo_getAliasName() As String
    If aliasNameToken Is Nothing Then
        ISQLTranslateTableInfo_getAliasName = ""
    Else
        ISQLTranslateTableInfo_getAliasName = aliasNameToken.value
    End If
End Function

' 读取原始的真实表名 （从 token 中读取）
' 子查询没有原始名称，默认返回 `""`
Public Function ISQLTranslateTableInfo_getOriginTableName() As String
    ISQLTranslateTableInfo_getOriginTableName = tableName
End Function

' 写入翻译后的真实表名
Public Sub ISQLTranslateTableInfo_setTranslatedTableName(ByRef name As String)
    ' noop
End Sub

' 读取翻译后的真实表名
' 子查询没有原始名称，也无法转换名称，默认返回 `""`
Public Function ISQLTranslateTableInfo_getTranslatedTableName() As String
    ISQLTranslateTableInfo_getTranslatedTableName = tableName
End Function

' 获取非要求类型的表名
Public Function ISQLTranslateTableInfo_getReverseTypeTableName() As String
    ISQLTranslateTableInfo_getReverseTypeTableName = tableName
End Function

' 返回当前表中的列名称映射
' 映射的内容包括:
'    转换后名称 --> 列名称信息
'    非要求类型名称 --> 列名称信息
'    列别名(如果有的话) --> 列名称信息
' @param translateType 转换的类型(逻辑->物理=0, 物理->逻辑=1)
' @return Map<String, ISqlTranslateNameInfo>
Public Function ISQLTranslateTableInfo_getTableColNameInfoMap(ByRef em As ISqlEntityManager, ByVal translateType As Integer) As Object
    ' 直接返回子查询作用域的筛选列名称映射
    Set ISQLTranslateTableInfo_getTableColNameInfoMap = selectTableEnv.getSelectColNameInfoMap(em, translateType)
End Function

' 在当前的表信息中搜索 colName 的转换后的名称
' 返回 null 表示搜索失败
' @param translateType 转换的类型(逻辑->物理=0, 物理->逻辑=1)
Public Function ISQLTranslateTableInfo_findColNameInfo(ByRef colName As String, ByRef em As ISqlEntityManager, ByVal translateType As Integer) As ISqlTranslateNameInfo
    Set ISQLTranslateTableInfo_findColNameInfo = selectTableEnv.findColNameInfoInSelectCols(colName, em, translateType)
End Function

' 执行表名 + 列名的替换
Public Sub ISqlTranslateTableInfo_translate(ByRef em As ISqlEntityManager, ByVal translateType As Integer)
    selectTableEnv.translate em, translateType
End Sub

' 返回有序的列名信息
' 遇到全数据列需要主动展开
' IObjArrayRef<IObjArrayRef<ISqlTranslateNameInfo>> 额外的一层 IObjArrayRef 用来兼容
' 子查询表中的 union 中产生的多个子查询的列对象
Public Function ISQLTranslateTableInfo_getOrderedTableColNameInfos(ByRef em As ISqlEntityManager, ByVal translateType As Integer) As IObjArrayRef
    Set ISQLTranslateTableInfo_getOrderedTableColNameInfos = selectTableEnv.getExpandedOrderedSelectColNameInfos(em, translateType)
End Function